﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI;
using Entidades.Seguridad;
using Modelo.Seguridad;
using MvcPaging;


namespace VistaOnlineR1._1.Controllers.Seguridad
{
    [Authorize(Roles = "Administracion")]
    public class GruposController : BaseController
    {
         #region campos
        CatalogoGrupos _catalogoGrupo;
        #endregion

        #region Constructors
        public GruposController()
            : this(new CatalogoGrupos())
        {
        }

        public GruposController(CatalogoGrupos catalogoGrupo)
        {
            _catalogoGrupo = catalogoGrupo;
        }
        #endregion
        private const int DefaultPageSize = 10;


        public ViewResultBase Search(string descripcion, bool estado, int? page)
        {

            List<Perfil> listPerfil = RecuperarPerfil();

            ViewBag.PermisoDelete = listPerfil.Any(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCrear = listPerfil.Any(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEditar = listPerfil.Any(per => per.Permiso.Nombre == "Edit");

            List<Grupo> listGrupos = _catalogoGrupo.ListarGrupos(descripcion, estado).ToList();

            int currentPageIndex = page.HasValue ? page.Value - 1 : 0;

            

            if (Request.IsAjaxRequest())
                return PartialView("Index", listGrupos.OrderBy(c => c.IdGrupo).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
            else
                return View("Index", listGrupos.OrderBy(c => c.IdGrupo).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
        }


        public ActionResult Index(int? page)
        {
            List<Perfil> listPerfil = RecuperarPerfil();

            ViewBag.PermisoDelete = listPerfil.Any(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCrear = listPerfil.Any(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEditar = listPerfil.Any(per => per.Permiso.Nombre == "Edit");

            List<Grupo> listGrupos = _catalogoGrupo.ListarGrupos().ToList();

            int currentPageIndex = page.HasValue ? page.Value - 1 : 0;


            return View(listGrupos.OrderBy(c => c.IdGrupo).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
        }

        public ActionResult Create()
        {

            return View();
        }

        [HttpPost]
        [Authorize(Roles = "Administracion")]
        public ActionResult Create(Entidades.Seguridad.Grupo oGrupo)
        {
            if (_catalogoGrupo.AgregarGrupo(oGrupo))
            {
                ModelState.AddModelError("", "El grupo se registro con exito.");
                return RedirectToAction("Index");
            }

            ModelState.AddModelError("", "El grupo ingresado ya pertenece al sistema.");
            return View(oGrupo); 
            
        }

        [Authorize(Roles = "Administracion")]
        public ActionResult Edit(string idgrupo)
        {

            Grupo oGrupo = _catalogoGrupo.BuscarGrupo(idgrupo);

            return View(oGrupo);
        }

        [HttpPost]
        [Authorize(Roles = "Administracion")]
        public ActionResult Edit(Entidades.Seguridad.Grupo oGrupo)
        {

            _catalogoGrupo.ModificarGrupo(oGrupo);
            return RedirectToAction("Index");
        }

        [Authorize(Roles = "Administracion")]
        public ActionResult Delete(string idgrupo)
        {
            Grupo oGrupo = _catalogoGrupo.BuscarGrupo(idgrupo);
            return View(oGrupo);
        }

        [HttpPost]
        [Authorize(Roles = "Administracion")]
        public ActionResult Delete(Entidades.Seguridad.Grupo oGrupo)
        {
           
            if (_catalogoGrupo.EliminarGrupo(oGrupo))
            {
                return RedirectToAction("Index");
            }

            ModelState.AddModelError("", "El Grupo que desea eliminar se encuentra asignado a un usuario y/o perfil.");
            return View(oGrupo);
        }

        public ActionResult EliminarUsuarioError()
        {
            return View();
        }

        [ChildActionOnly]
        public ActionResult GenreMenu()
        {
            var genres = _catalogoGrupo.ListarGrupos().ToList();

            return PartialView(genres);
        }
    }
}
